package com.liu.juc;

public class TestVolatie {

/**
 *  volatile关键字：表示多线程操作内存共享数据的时候，内存数据共享可见，也可以理解成在主存中操作。
 *                  synchronized  是一个轻量级的同步策略
 *
 * 注意：
 *     volatile ：不具备“互斥性”、
 *               不能保证 变量的“原子性”
  */


    public static void main(String[] args) {
        TheadDemo td = new TheadDemo();
        Thread  t = new Thread(td);
        t.start();


        while (true){
//            synchronized (td){ // 使用同步锁的方式，可以解决内存不可见的问题、有锁的话，线程效率低。
                if (td.isFlag()==true){
                    System.out.println("========================");
                    break;// 这种情况下，产生内存可见性问题，多个线程操作共享数据的时候，是彼此不可见的。
                }
//            }

        }
    }

}

class TheadDemo implements  Runnable{


    private volatile  boolean flag =false;

    @Override
    public void run() {

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag=true;

         System.out.println("现在打印flag的值"+isFlag());

    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}